package org.example.algorithm;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 用队列实现栈:
 * 请你仅使用两个队列实现一个后入先出（LIFO）的栈，并支持普通栈的全部四种操作（push、top、pop 和 empty）。
 */


public class UseQueueImplementStackSolution {

    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        myStack.push(4);
        myStack.push(2);
        System.out.println(myStack.top());
        int topMember = myStack.pop();
        System.out.println(topMember);
        System.out.println(myStack.empty());
        myStack.pop();
        System.out.println(myStack.empty());
    }
}

class MyStack {
    private Queue<Integer> queue1;
    private Queue<Integer> queue2;


    public MyStack() {
        queue1 = new LinkedList<>();
        queue2 = new LinkedList<>();
    }

    public void push(int x) {
        if (queue1.isEmpty()) {
            queue1.add(x);
            if (!queue2.isEmpty()) {
                int queue2Size = queue2.size();
                for (int i=0;i<queue2Size;i++) {
                    queue1.add(queue2.poll());
                }
            }
            return;
        }
        if (queue2.isEmpty()) {
            queue2.add(x);
            if (!queue1.isEmpty()) {
                int queue1Size = queue1.size();
                for (int i=0;i<queue1Size;i++) {
                    queue2.add(queue1.poll());
                }
            }
        }
    }

    public int pop() {
        if (!queue1.isEmpty()) {
            return queue1.poll();
        }
        return queue2.poll();
    }

    public int top() {
        if (!queue1.isEmpty()) {
            return queue1.peek();
        }
        return queue2.peek();
    }

    public boolean empty() {
        return queue1.isEmpty() && queue2.isEmpty();
    }
}
